/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.gbvbahia.projeto.beans.facade;

import br.com.gbvbahia.projeto.entidades.Grupo;
import br.com.gbvbahia.projeto.beans.facade.commons.AbstractEntityBeans;
import br.com.gbvbahia.projeto.beans.facade.interfaces.GrupoFacade;
import br.com.gbvbahia.utils.UtilBeans;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceContextType;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 * Classe que representa bean de entidade de Grupo.
 *
 * @author Guilherme Braga
 * @since 17/04/2012
 */
@Repository(value = "grupoFacade")
@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
public class GrupoBean extends AbstractEntityBeans<Grupo, String>
        implements GrupoFacade {

    /**
     * Unidade de persistência <i>jdbc/***</i>.
     * <br>EXTENDED: O contexo de persistencia extendido vive por mais
     * tempo que uma transação, as instâncias de um objeto de entidade
     * que são acopladas a uma contexto estendido permanecem gerenciadas
     * mesmo depois de uma transação ser concluída.
     * <br>TRANSACTION: O contexto de persistência duram pelo tempo de
     * uma transação e são fechados quando uma transação se completa.
     * <b>Somente instâncias EntityManager injetadas com a anotação
     * @PersistenceContext podem ter escopo de trasação.</b>
     * <br>Explicação retirada do livro Enterprise JavaBeans 3.0
     * O'Reilly. Esta parte de o EntityManager somente em casos que o
     * mesmo é injetado, você pode se perguntar, como eu, no Spring o
     * EntityManager também é injetado, acredito que o autor não
     * lembrou do Spring quando escreveu isso, na época o Spring tava
     * iniciando a injeção, a 1ª edição é de 2006.
     */
    @PersistenceContext(unitName = UtilBeans.PERSISTENCE_UNIT,
    type = PersistenceContextType.EXTENDED)
    private EntityManager dao;

    /**
     * Construtor padrão que passa a classe que representa para
     * AbstractEntityBeans.
     */
    public GrupoBean() {
        super(Grupo.class);
    }

    @Override
    protected EntityManager getEntityManager() {
        return dao;
    }
}
